package core.molecules;

/**
 * An interface for anything that carries the qualities of a molecule
 * @author Julian
 *
 */
public interface IMolecule extends Comparable<IMolecule> {

	/**
	 * returns the mass of this molecule
	 * @return
	 */
	double getMass();
	
	/**
	 * returns the number of subparticles within the molecule
	 * @return
	 */
	double getNumSubParticle();

	
	/**
	 * Returns the oxidation state of the molecule
	 * @return
	 */
	int getOxidationState();
	
	
	/**
	 * Returns the string abbreviation commonly associated with this molecule
	 * @return
	 */
	String getAbbr();

	
	/**
	 * Get this molecule's ID number tag
	 * @return
	 */
	Integer getID();

	/**
	 * Check to see if this molecule carries any sub-particles/is considered "empty"
	 * @return
	 */
	boolean isEmpty();

	
	/**
	 * remove all empty molecules from this and any smaller molecules held within
	 */
	void trimEmptyMolecules();
	
	
	/**
	 * Test is this molecule is equal to other molecule. Typically done by ID#
	 * @param m
	 * @return
	 */
	boolean equals(IMolecule m);
}
